Zelda II - Music Info & Expansion v1.3 By: IcePenguin Date: 3/13/19 Version 1.1: Added a bunch of stuff. Fixed typos. Version 1.2: Added assembly code. Refined sections for clarity. Version 1.3: Fixed an error in section 04. Added sections 05 and 08. ======================================================================= First off, download and read optomon's music document. He explains a good amount about music, and it will help you understand everything even more! So before you proceed with this, do that - even if you don't understand it. In this document, I will constantly remind you to read it, so you might as well, ha ha. http://www.romhacking.net/documents/692/ Also, I am not a music composer, and cannot help you in writing new songs. I don't know anything about music terminology, what notes are, or any of that musical magic. Use optomon's document for reference, especially on important things related to Zelda II musical notation. If you need help composing music, ask for help on the RHDN forums. TABLE OF CONTENTS ================= 01. Music Data 02. Song ID # 03. Song Tables & Phrase Layout Tables 04. Phrase Structure 05. Notation 06. Using Songs Anywhere 07. Music Expansion 08. Adding a New Song (FDS Battle Theme) 09. Expanding the Song Table 10. Sound ID # ======================================================================= 01. Music Data ======================================================================= optomon's document has a bunch of important data, as well, so make sure to use that for additional reference! Various file addresses with data related to music: 8A1 - Data for loading overworld music when exiting areas. DB5 - Data related to music and sounds. 19499 - Data for loading battle music when encountering enemies on the overworld. 19B91 - Data for checking the world location at RAM address $707, and then playing the correct song. 19B97 - Data for loading song table in world location 00. 19BD6 - Data for loading song table in world location 01/02. 19C15 - Data for loading song table in world location 03/04. 19C52 - Data for loading song table in world location 05. 1C446 - Music to load after you die. This is applied for the entire game and loads the song depending on your world location. 1C712 - Music data after falling into a hole in some secret caves, as well as dungeons. This is applied for the entire game and loads the song depending on your world location. 1CBBA - Part of the routine that stores the world location at ram address $707. 1CBD8 - Data for loading music in caves, secret areas. (not holes) The music for falling in holes is similar to how dying works. This is because you can fall into holes in many different locations. So when you fall into a hole, or die, the game checks your world location and then it plays the correct song when the scene loads again. ======================================================================= 02. Song ID # ======================================================================= Depending on the world location at RAM address $707, the song ID will load different songs. World location 00 = all overworlds/caves/environments: Song ID 01 = overworld intro Song ID 02 = overworld theme Song ID 04 = battle theme normal Song ID 08 = battle theme variation Song ID 10 = item found tune Song ID 20 = none Song ID 40 = none Song ID 80 = none World location 01 / 02 = West Hyrule towns / East Hyrule towns Song ID 01 = town intro Song ID 02 = town theme Song ID 04 = house theme variation Song ID 08 = house theme Song ID 10 = item found tune Song ID 20 = none Song ID 40 = none Song ID 80 = none World location 03 / 04 = palaces 1, 2, 5 / palaces 3, 4, 6 Song ID 01 = palace intro Song ID 02 = palace theme Song ID 04 = palace theme variation Song ID 08 = boss theme Song ID 10 = item found tune Song ID 20 = none Song ID 40 = crystal statue tune Song ID 80 = none World location 05 = great palace Song ID 01 = great palace intro Song ID 02 = great palace theme Song ID 04 = zelda and link together theme Song ID 08 = credits theme Song ID 10 = item found tune Song ID 20 = triforce obtained tune Song ID 40 = final boss theme Song ID 80 = none ======================================================================= 03. Song Tables & Phrase Layout Tables ======================================================================= Here is a simple outline of how music data is ordered: Song Table > Phrase layout Tables > Phrase Structures > Notation Nothing determines the length of a song. There is no limit to how many phrases it can have. However, there is a limit to the length a phrase can be which is 16 notes. This is explained in optomon's document, and he has a lot of knowledge of the how NES music works, as well as how it works in Zelda II. Remember to separate different parts of music data with a 00 byte. This is to tell the game when something ends. The only time this isn't required is for the phrase structure data, which you'll learn about. There are 4 song tables used while playing the game: 1A010 - Song table for world location 00. 1A3DA - Song table for world location 01/02. 1A63F - Song table for world location 03/04. 1A946 - Song table for world location 05. For this document, I will be covering only world location 00 songs, but if you know how to change one, you can change any of them. 1A010 - Table for world location 00 songs. It is 9 bytes. Each byte determines the offset that each song is located from 0x1A010. 08 = overworld intro 0A = overworld theme 17 = battle theme normal 17 = battle theme variation (never used) 1C = item found tune 1E = nothing 1E = nothing 1E = silent. used for loading new areas. 1F = overworld intro Byte 1 is song ID 01. Byte 2 is song ID 02. Byte 3 is song ID 04. Byte 4 is song ID 08. Byte 5 is song ID 10. Byte 6 is song ID 20. Byte 7 is song ID 40. Byte 8 is song ID 80. Byte 9 is used for song intros (overworld, town, palace, great palace, etc.) and is used by byte 1. 1A01A - Overworld theme phrases. Exactly 0A from 0x1A010. This is the layout of the song's phrases. These work similar to the song table, but the offset starts from 0x1A00A. So the first phrase in the overworld theme is $25 bytes from this address at 0x1A030. (starts with 73 A0) The second phrase is also $25 bytes away, and the third phrase is $2B bytes away, etc. In this case, the first and second phrase use the same thing. 1A01A - This is every phrase of the entire overworld theme: 25 25 2B 31 2B 37 3D 3D 43 49 43 4F 1A027 - This is every phrase of the entire battle theme: 55 5B 61 67 1A02C - This is the phrase for the item found tune: 6D ======================================================================= 04. Phrase Structure ======================================================================= Let's follow the data for the battle theme. We'll start at 0x1A010 in the song table. The battle theme is byte 3 in the table, which is the song ID 04. The value is 17, which points to the phrase layout table. From 0x1A010, count $17 bytes forward to reach its layout data at 0x1A027: 55 5B 61 67 Phrase structure is located by counting foward from the offset at file address 0x1A00A. This is according to optomon's document. Starting at 0x1A00A, count $55 bytes ahead to reach 0x1A060, which is the beginning of the battle theme's phrase structure. Phrase structure is always 6 bytes long. 55 = 42 A2 0D 09 15 08 5B = 5F A2 17 0C 2F 08 61 = 95 A2 1A 0D 32 08 67 = CE A2 31 19 51 08 optomon's document explains each of these in great detail except for the last byte. That byte determines the speed/tempo of the phrase. 00 = fast 08 = normal 10 = I used this for the FDS battle theme (below) 18 = slow The first 2 bytes are a pointer to the notation of the phrase. So the first phrase of the battle theme (55), has 42 A2 which points to file address 0x1A252. Again, read optomon's document for details on each channel of sound, including: Square 1, Square 2, Triangle, and Noise channel, and how they are arranged to form music. ======================================================================= 05. Notation ======================================================================= Phrase structure is what points to the musical notation. This includes things like notes, pitch, duration, etc. As optomon said in his document, each phrase has a limit of 16 notes. The phrase layout table determines the order in which these phrases are played. I won't cover any notation, since optomon's document lists everything related to this in great detail. You might also consider loading up a copy of "Shadow of Night" to see how he composed the overworld theme in that. It could really help with understanding the process. Keep in mind, that phrases must be separated with a 00 byte, to let the game know when something ends. Also, here is a brief recap on the full layout of how music data is stored for world location 00: 1A010 - 1A018: Song table. 1A01A - 1A02C: Phrase layout tables. 1A02F - 1A082: Phrase stucture. 1A083 - 1A3E3: Notation for songs in world location 00. It is the same for each world location, but those are stored elswhere, and all 4 song tables are listed at the start of section 03. ======================================================================= 06. Using Songs Anywhere ======================================================================= To do this, you can't just simply tell the game to play a song in a specific area by changing a byte. You have to manipulate the world location so it knows which set of songs to work with, and then load a song ID of your choosing. However, messing with the world location isn't a good idea, because it can cause some serious issues. So what we will do is store a COPY of the world location to a new byte ram, so we can freely change it, without messing up the real world location. You will eventually use this method to assign different songs to any area of the game. This will require a JSR (Jump to Subroutine) and a tiny bit of new code to change the Song ID and world location copy - something we will set up in this section. There is also an example on how to do this with the battle theme, to give you an idea of what you need to do for other areas of the game. ----------- First, at file address 0x19B91 you'll find part of the music routine that checks the world location, and plays the correct song. It will look like this: AD 07 07 Assembly: AD 07 07 LDA $0707 The whole routine is more complex than that, but for now this is the only part we need. Let's modify it, so it uses a different part of ram and doesn't use the actual world location. Change it to: AD 02 07 Assembly: AD 02 07 LDA $0702 Now the music routine checks ram address $702 for the world location, instead of $707. And since $702 is nothing, we can change it whenever we want to, without messing up the real one. ----------- Next, we have to change part of the routine for world location to copy itself to ram address $702, when you enter an area. Go to file address 0x1CBBA. You'll find: 8D 07 07 Assembly: 8D 07 07 STA $0707 This is part of the routine for when the game stores the current world location. Let's add a JSR here, so we can add code to it, so it makes a copy of itself to our new designated ram location at $702. Change it to: 20 AA FE Assembly: 20 AA FE JSR $FEAA This JSR goes to file address 0x1FEBA. At 0x1FEBA, paste this code: 8D 07 07 AD 07 07 8D 02 07 60 Assembly: 8D 07 07 STA $0707 AD 07 07 LDA $0707 8D 02 07 STA $0702 60 RTS We still have the original code 8D 07 07, but the new code AD 07 07 loads the value of the real world location, and stores it 8D 02 07 in the copy at ram address $702. Every JSR needs an RTS (Return from Subroutine) at the end of any new code you write. ----------- Next, we have to add more code for copying the world location when you exit an area to the overworld. Go to file address 0x8A1. You'll find: A9 02 85 EB Assembly: A9 02 LDA #$02 85 EB STA $EB This loads song ID 02 into ram address $EB, and plays the overworld theme any time you exit an area. We are going to add a JSR here so we can add some code to update our new byte in ram $702, which is our world location copy. Change it to: 20 C0 A8 EA Assembly: 20 C0 A8 JSR $A8C0 EA NOP This JSR goes to file address 0x28D0. The EA byte is the NOP (no operation) opcode, and is used to so we can remove that last byte of the original code. Sometimes you'll a lot of these if replacing large chunks of code with a single JSR. At 0x28D0, paste this code: AD 07 07 8D 02 07 A9 02 85 EB 60 Assembly: AD 07 07 LDA $0707 8D 02 07 STA $0702 A9 02 LDA #$02 85 EB STA $EB 60 RTS Like before, we will still use the original code A9 02 85 EB, but we will also add to it. The new code here AD 07 07, loads the value at ram address $707, which is the real world location, and then stores it 8D 02 07 in our world location copy at ram address $702. Remember, only change the world location COPY when you want to use different songs in areas. ----------- Finally, let's do an example with the battle theme music - played when you encounter an enemy on the overworld. Go to file address 0x19499. You'll find: A9 04 85 EB Assembly: A9 04 LDA #$04 85 EB STA $EB This loads song ID 04 into ram address $EB, and plays the battle theme any time you encounter an enemy on the overworld. Let's add a JSR here, so we can add new code to change the song and the world location copy we set up at $702. Change it to: 20 C0 9D EA Assembly: 20 C0 9D JSR $9DC0 EA NOP This JSR points so file address 0x19DD0. At 0x19DD0, paste this: A9 04 85 EB A9 00 8D 02 07 60 Assembly: A9 04 LDA #$04 85 EB STA $EB A9 00 LDA #$00 8D 02 07 STA $0702 60 RTS We still have the original code to load the battle theme A9 04 85 EB, but now we have code to change the world location copy to use pretty much any song. A9 00 8D 02 07 This is setting world location copy to 00, so it will play the battle theme like normal. If you change the world location copy to 03, which is palaces, it will play the palace theme variation instead! Any time you want to use a unique song in an area, you'll have to do something like this, and change the world location COPY. Remember, NEVER change the REAL world location at $707! ======================================================================= 07. Music Expansion ======================================================================= Go to file address 0x1A010. You should know what this data is by now, after reading optomon's document and the sections above. What we want to do is expand these tables to add more songs, but we we can't do that because the overworld theme starts immediately after the phrase structures, at 0x1A083. So let's move this song! Copy the bytes from 0x1A083 - 0x1A259, which is 1D7 bytes in length. This is the entirety of the overworld theme. Paste it all at file address 0x1B083. (plenty of free space here!) Next, replace the original overworld theme, all 1D7 bytes, with FF. If you were to play the game now, the overworld theme would sound really amazing and beautiful... Let's fix that by updating the phrase pointers. Perhaps you noticed we moved the overworld theme exactly 0x1000 bytes ahead. This is to help those less experienced understand how pointers work, and it should be easier to follow. If you haven't yet, learn about the different parts of the phrase structure, by reading optomon's document, and then change each pointer in the overworld theme to point to the new location where we copy/pasted the data. The new pointers will look something like this: 1A030: 73 A0 > 73 B0 1A036: EB A0 > EB B0 1A03C: 48 A1 > 48 B1 1A042: 73 A1 > 73 B1 1A049: A2 A1 > A2 B1 1A04E: DA A1 > DA B1 1A054: FC A1 > FC B1 1A05A: 1D A2 > 1D B2 After this, the overworld theme should be back to normal, but now you will have a ton of free space where it used to be. ----------- Let's also re-locate the battle theme and item found tune! Copy the data from 0x1A25A - 0x1A3E3. The 00 bytes are required to separate music data. So copy all 18A bytes, and paste them to file address 0x1B25A. Then remove the original data to free up that space. However, we don't want to remove all 18A bytes. The last 1A bytes are shared between the item found tune and town theme. So you only want to remove 170 bytes, and the end of this new free space should be at 0x1A3C9 like this: 00 A4 9A... Then make the following changes to the pointers in each phrase: 1A060: 42 A2 > 42 B2 1A066: 5F A2 > 5F B2 1A06C: 95 A2 > 95 B2 1A072: CE A2 > CE B2 1A078: 26 A3 > 26 B3 1A07E: B1 A3 > B1 B3 After this, the overworld theme, battle theme, and item found tune should all be located together in free space. ----------- Next, we have to relocate the phrase structure data for each song, and this is located from 0x1A02F - 0x1A082. For the example, let's move it down by 0x10 bytes, so it starts at 0x1A03F instead. Replace the original, unwanted data starting at 0x1A02F with: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Since we moved the phrase structure, we need to update the table for each song to point to the new locations. Since we only moved it down by 0x10 bytes, this will be simple. For the overworld theme, change it like so: from: 25 25 2B 31 2B 37 3D 3D 43 49 43 4F to: 35 35 3B 41 3B 47 4D 4D 53 59 53 5F For the battle theme, change it like so: from: 55 5B 61 67 to: 65 6B 71 77 And then change the item found tune from 6D to 7D. ----------- Next we need to adjust the table of songs at 0x1A010. These point to the tables we just changed. Starting at 0x1A010, count that many bytes ahead to reach the song. The overworld intro, 08, points ahead to 1F, at 0x1A018, which then points to 0x1A02F. The reason the intro does this is because it's not a part of the overworld theme and doesn't play when it loops. This is what optomon said to probably be the case, so we'll go with it. 0A: Points to the overworld theme, at 0x1A01A. 17: Both bytes point to the battle theme, at 0x1A027. 1C: Points to the item found tune, at 0x1A02C. 1E: All three point to 00, which is nothing, at 0x1A02E. 1F: Points to 0x1A02F, as mentioned a little bit ago. In this example, change them to this: 08 0A 17 17 1C 2E 2E 2E 2F We don't need to change the first 5 songs, because nothing was changed for those. At this point, you should be able to play the game, and everything will playing as normal. If there are issues with the music, then retrace your steps, to make sure everything was done properly. With the newly created free space, we can add a new song! ======================================================================= 08. Adding a New Song (FDS Battle Theme) ======================================================================= Let's add the battle theme from the FDS version of Zelda II! Follow the steps in section 06. before starting. Here is the musical data for the battle theme from that version: 00 E8 E4 DE D8 50 18 58 1E 5E 18 64 10 48 08 48 08 48 08 48 08 1B 19 D6 00 11 0F CC DA 9A DA 9A 9A 9A 21 1F DC 00 17 15 D2 E0 A0 E0 A0 A0 A0 9A A0 A6 EC A6 E0 00 94 9A A0 E6 A0 DA 9A DA E0 9A E6 98 9E A4 EA A4 DE 00 92 98 9E E4 9E D8 98 D8 DE 98 E4 AC A4 9A AE A4 9E 33 43 00 This includes the notes, pitch, duration, etc. Again, read optomon's document for all this info, and how to actually compose new songs! I just simply copy/pasted this from the .fds file. For this example, we are gonna paste it where the original battle theme used to be. It should now be empty space. So copy/paste the data for the FDS battle theme, and paste it to 0x1A25A. You can do this to any free space, but I did it here to make it simple. Now we have to add the phrase structure, create a new table pointing to the phrase structure, and then update the song table to assign a song ID to the new battle theme. From 0x1A02E - 0x1A03D, you should have a bunch of 00 bytes. If not, you missed a previous step. Paste this data there: 88 88 8E 8E 88 88 8E 8E 94 94 9A 9A 94 94 9A 9A This data is the layout of the phrases for the entire battle theme from the FDS version. It repeats each phrase twice, then switches to the next phrase in the song. Now that we have the phrase layout, we need to add the phrase structure. Let's add this to the end, right after the item found tune, at 0x1A093. Now that the overworld theme is re-located, we can add on to this freely! Paste this: 42 A2 0D 09 15 10 5F A2 07 04 00 10 6C A2 07 04 00 10 79 A2 0D 07 00 10 8B A2 0D 07 00 10 Like every song, each phrase structure is 6 bytes long. So starting from file address 0x1A00A, the first and second phrase is 88 bytes ahead, the third and fourth phrase is 8E bytes ahead, etc. Again, to understand the phrase structure, read optomon's document! ----------- The final step is to change the song table. Notice how there are two songs that point to the original battle theme? 17 17. Let's use the second one to point to our new song. It is never used, so there is no harm in using it. Change the second 17 to 1E, which will point to 0x1A02E. The song ID for this is 08, and will play if the world location is 00. Lastly, to change the songs for other world locations, you'll have to repeat everything you learned in here for their song tables and phrase structures. This info is listed in section 03. of this document. ======================================================================= 09. Expanding the Song Table ======================================================================= Within the limits of the original game, there are a total of 9 unused music IDs between all song tables. With the abundance of free space, this allows for quite a bit of expansion in itself. It's enough to give every palace a unique theme, plus a unique theme for each of the overworld maps! However, if you want to actually expand the song tables beyond their default limit, it could get a little more... tricky. Take this time to decide if the 9 extra songs is enough for you, or if you want to have even more. ----------- Before attempting to expand the song table, follow this document to make necessary free space. The following steps rely on this. There are most likely a ton of ways to expand the song table, and the method in this section will nearly double it. Instead of 8 songs, you will have 15 songs. Here is the original song table at 0x1A010: 08 0A 17 17 1C 1E 1E 1E 1F Remember, 1F is byte 9 of the song table. We won't be duplicating this, since it doesn't have a song ID, so we will move it out of the song table later. Let's say we expanded it to look like this: 08 0A 17 17 1C 1E 1E 1E 08 0A 17 17 1C 1E 1E 1E By the end of this section, your song table will look something like that. Song ID 80 will be moved to the end of the table, but the "silent" song will remain at byte 8 of the song table. When loading new areas, the game will still think byte 8 is song ID 80, because apparently, that works differently than the music routine. With the expanded table, here are the new song ID #: 01 02 04 08 10 20 40 XX 81 82 84 88 90 A0 C0 80 = ID ----------------------------------------------- 08 0A 17 17 1C 1E 1E 1E 08 0A 17 17 1C 1E 1E 1E = Song Table XX is still the designated "silent" song, which is okay, because it doesn't even have a valid song ID. ----------- With that out of the way, let's get started. First, move all phrase structure data down by 0x10 bytes. We did this in the document before, in section 06. After you move those, do the same thing for every song phrase layout table. Move all those down by 0x10 bytes, as well. Then update each song's phrase layout table to point to the new location of the phrase structures. When that's done, replace any old data with 00 to make room for the expanded song table. Next, let's relocate byte 9 of the original song table. We don't need to duplicate this, so move it right before the overworld theme phrase layout table. Make sure to keep them separated with a 00 byte. Then update each byte in the song table to point to the new locations of everything. (byte 9, phrase layout tables, etc.) When finished, your song table should look like this, followed by a bunch of 00 bytes, byte 9 (3F), and the overworld phrase layout table: 18 1A 27 2E 2C 3E 3E 3E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3F 00 45....etc. With everything in order, you can now duplicate the song table! 18 1A 27 2E 2C 3E 3E 3E 18 1A 27 2E 2C 3E 3E 3E 00 00 00 00 00 00 00 00 3F 00 45....etc. ----------- Now let's do some ASM modifications. First, we have to add a bit of code to a couple of things that we added previously in this document. This new code is to make sure the expanded table works properly. We will be using ram address $F2, but any unused location in memory will work perfectly fine. At 0x19DD0, we added this code before: A9 04 85 EB A9 00 8D 02 07 60 Assembly: A9 04 LDA #$04 85 EB STA $EB A9 00 LDA #$00 8D 02 07 STA $0702 60 RTS This stores the song ID at ram address $EB and stores 00 in the world location copy at $702. All we want to do is store the song ID in an extra location in memory. For this document, we will be using ram address $F2. So change the code to this: A9 04 85 EB 85 F2 A9 00 8D 02 07 60 Assembly: A9 04 LDA #$04 85 EB STA $EB 85 F2 STA $F2 A9 00 LDA #$00 8D 02 07 STA $0702 60 RTS This will store the song ID at $F2, but it will only be temporary, which you'll see why in the next part. Anytime you want to use a song with an ID of 80, or greater, you will have to store its ID at ram address $F2. ----------- At 0x28D0, we added this code before: AD 07 07 8D 02 07 A9 02 85 EB 60 Assembly: AD 07 07 LDA $0707 8D 02 07 STA $0702 A9 02 LDA #$02 85 EB STA $EB 60 RTS We have to add a bit of code here, as well, so it should look like this now: AD 07 07 8D 02 07 A9 02 85 EB A9 00 85 F2 60 Assembly: AD 07 07 LDA $0707 8D 02 07 STA $0702 A9 02 LDA #$02 85 EB STA $EB A9 00 LDA #$00 85 F2 STA $F2 60 RTS The new code A9 00 85 F2 is to reset ram address $F2 back to 00, any time you exit a side-scrolling area. This is done so that when you exit an area, the game will switch back to the normal song table for the overworld. ----------- At 0x19B99, you'll find the following data: B9 FF 9F Assembly: B9 FF 9F LDA $9FFF,Y This bit of data is part of the routine that loads songs from the song table in world location 00. Let's add a JSR here: 20 F0 9D Assembly: 20 F0 9D JSR $9DF0 This JSR points to 0x19E00. At this location, paste the following code: A5 F2 C9 80 10 04 B9 FF 9F 60 B9 07 A0 60 Assembly: A5 F2 LDA $F2 C9 80 CMP #$80 10 04 BPL Branch B9 FF 9F LDA $9FFF,Y 60 RTS Branch B9 07 A0 LDA $A007,Y 60 RTS This checks the song ID at ram address $F2. If the song ID is less than 80, it will use songs from the original song table at file addess 0x1A010. If it is 80 or greater, it will use songs from the expanded part of the song table at file address 0x1A018. That's it! As I said before, these modifications are only for the song table in world location 00. If you want to expand every song table, towns, palaces, great palace, you'll have to follow every step again within this document. The data for the other tables is in section 01. so you should be able to locate the song tables, phrase layout tables, and the phrase structure data. Good luck! :) ======================================================================= 10. Sound ID # ======================================================================= This section will list the ID for various sounds throughout the game, and which byte in memory controls them. RAM $E9: -------- ID 01: Link taking damage. ID 02: Ganon's laugh on game over. ID 04: none ID 08: none ID 10: none ID 20: none ID 40: none ID 80: none RAM $EB: -------- Reserved for music. RAM $EC: -------- ID 01: Link dead. ID 02: Attack enemy shield, wall, or any hard object. ID 04: Casting magic. ID 08: Playing the flute. ID 10: Using the Spell spell in New Kasuto secret area. ID 20: ??? Maybe related to riding the raft, or finding a fairy... ID 40: Opening Great Palace entrance barrier. ID 80: Boss dead. RAM $ED: -------- ID 01: none ID 02: Walking over collapsing bridge. ID 04: Breaking block. ID 08: none ID 10: Damaging enemy with sword. ID 20: Swing sword without full health. ID 40: Fire ID 80: Swing sword with fire spell active. RAM $EE: -------- ID 01: Falling into a hole. ID 02: Encountering overworld enemy. ID 04: Exit side area to overworld. ID 08: Move cursor in menus. ID 10: Block projectile with shield. ID 20: Walking in swamp. ID 40: none ID 80: none RAM $EF: -------- ID 01: none ID 02: Fairy spell active. ID 04: Enemy dead. ID 08: Sword beam. ID 10: Restoring health or magic. ID 20: Using elevator. ID 40: Low health. ID 80: none ======================================================================= Huge thanks to optomon for his awesome music document! Thanks to Trax for pointing out an error in the document.